package config

import (
	"encoding/json"
	"io/ioutil"
	"log"
)

// Config 配置结构体
type Config struct {
	Version string `json:"Version"`
	MQTT    MQTT   `json:"MQTT"`
	Task    []Task `json:"Task"`
}

// MQTT MQTT配置
type MQTT struct {
	ServerType            int    `json:"serverType"`
	Host                  string `json:"host"`
	Port                  int    `json:"port"`
	UserValidationEnabled int    `json:"userValidationEnabled"`
	Username              string `json:"username"`
	Password              string `json:"password"`
}

// Task 任务配置
type Task struct {
	TaskNum              int      `json:"taskNum"`
	TaskName             string   `json:"taskName"`
	ProjectIdentifier    string   `json:"projectIdentifier"`
	ProjectKey           string   `json:"projectKey"`
	QoS                  int      `json:"qos"`
	Remark               string   `json:"remark"`
	TypeIndex            int      `json:"typeIndex"`
	Type                 string   `json:"type"`
	Database             string   `json:"database"`
	Host                 string   `json:"host"`
	Port                 int      `json:"port"`
	Username             string   `json:"username"`
	Password             string   `json:"password"`
	StorageType          int      `json:"storageType"`
	Days                 int      `json:"days"`
	Hours                int      `json:"hours"`
	GroupIdentifier      []string `json:"groupIdentifier"`
	KeyChannelIdentifier []string `json:"keyChannelIdentifier"`
	RemoteWritingEnabled int      `json:"remoteWritingEnabled"`
	CommandTable         string   `json:"commandTable"`
	CommandHistoryTable  string   `json:"commandHistoryTable"`
	PollingPeriod        float64  `json:"pollingPeriod"`
}

// LoadConfig 加载配置文件
func LoadConfig(filename string) ([]Config, error) {
	log.Printf("正在加载配置文件: %s", filename)
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		log.Printf("读取配置文件失败: %v", err)
		return nil, err
	}
	log.Printf("配置文件读取成功，大小: %d 字节", len(data))

	var configs []Config
	err = json.Unmarshal(data, &configs)
	if err != nil {
		log.Printf("解析配置文件失败: %v", err)
		return nil, err
	}
	log.Printf("配置文件解析成功，共 %d 个配置", len(configs))

	return configs, nil
}

// GetMQTTConfig 获取MQTT配置
func GetMQTTConfig() (*MQTT, error) {
	log.Println("开始获取MQTT配置...")
	configs, err := LoadConfig("config/setting.json")
	if err != nil {
		log.Printf("加载配置失败: %v", err)
		return nil, err
	}

	if len(configs) == 0 {
		log.Println("配置文件中没有找到有效配置")
		return nil, nil
	}

	log.Printf("成功获取MQTT配置: %s:%d", configs[0].MQTT.Host, configs[0].MQTT.Port)
	return &configs[0].MQTT, nil
}

// GetTasks 获取任务配置
func GetTasks() ([]Task, error) {
	log.Println("开始获取任务配置...")
	configs, err := LoadConfig("config/setting.json")
	if err != nil {
		log.Printf("加载配置失败: %v", err)
		return nil, err
	}

	if len(configs) == 0 {
		log.Println("配置文件中没有找到有效配置")
		return nil, nil
	}

	log.Printf("成功获取任务配置，共 %d 个任务", len(configs[0].Task))
	return configs[0].Task, nil
}
